import Layout from '@/layout'

const _import = require('@/router/_import_' + process.env.NODE_ENV)

/**
 * @description 将从 api 得到的动态菜单 json 转成 routeList
 * @param {Array} aryDynamicMenu
 * @returns {Array}
 */
export function transMenuToRouter(aryDynamicMenu) {
  const aryRoute = aryDynamicMenu.filter((route) => {
    // console.log('route:', route)
    // 将 component 字符串转成组件
    if (route.component && route.component !== '' && typeof route.component === 'string') {
      // Layout组件特殊处理
      if (route.component === 'layout') {
        route.component = Layout
      } else {
        route.component = _import(route.component)
      }
    }
    // 如果有子路由则递归操作
    if (route.children && route.children !== null && route.children.length) {
      route.children = transMenuToRouter(route.children)
    }
    return true
  })
  return aryRoute
}

/**
 * （没有用到此方法） 用递归(recursion) 设置动态路由表，
 * @param routes 第一次执行的时候，传入的是从api得到的json路由数组
 * @returns 返回动态路由数组
 */
export function setDynamicRouteList(routes) {
  // 第一次执行的时候，传入的是从api得到的json路由数组
  // 这个数组里的component还是字符串格式，要把他们全部转成组件
  const aryResultRoute = []
  // 动态路由表里的每一个路由route
  routes.forEach((route) => {
    // 用...语法将路由暂存到tmp数组里
    const tmpRoute = {
      ...route,
    }
    // 如果这个路由还有子路由
    if (tmpRoute.children) {
      // 递归对子路由进行过滤
      tmpRoute.children = setDynamicRouteList(tmpRoute.children)
    }
    // 将包括这个角色的路由push到结果路由数组里
    aryResultRoute.push(tmpRoute)
  })
  return aryResultRoute
}

/**
 * @description 判断给定的 route 里包含的角色和给定的角色数组是否有匹配的值
 * @param {Array} roles 角色数组
 * @param {Object} route 路由
 * @returns {Boolean} 判断route里是否包含指定角色数组
 */
export function hasPurview(roles, route) {
  // 如果路由的 roles 变量值不为空，则进行判断
  if (route.roles) {
    /** some() 方法测试数组中是不是有元素通过了被提供的函数测试
     * 它返回的是一个Boolean类型的值
     * 只要数组中有一个元素通过回调函数的测试就会返回true；
     * 所有元素都没有通过回调函数的测试返回值才会为false
     * 注意： 如果用一个空数组进行测试， 在任何情况下它返回的都是false
     */
    return roles.some((role) => {
      // 根据some()方法的定义，
      // 路由数组里某个路由的meta属性里的roles数组里有给定的role，就返回true
      return route.roles.includes(role)
    })
  } else {
    // 如果路由的 roles 变量值为空则直接返回true（说明此路由不需要权限，直接放行）
    return true
  }
}
